﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Commander_Wars.Spieletools
Public Class ObjektMaus
    Public Shared Zustand As Zustände = Zustände.Normal
    Public Enum Zustände
        Menü
        Normal
        NichtPlazierbar
        Abzug
        Angriff
        SiloAnzeigeKlein
        SiloAnzeigeMittel
        SiloOmegaRakete
    End Enum
    Private Shared XKoordinaten As Integer
    Public Shared Property XKoordinate() As Integer
        Get
            Return XKoordinaten
        End Get
        Set(ByVal value As Integer)
            XKoordinaten = value
        End Set
    End Property
    Private Shared YKoordinaten As Integer
    Public Shared Property YKoordinate() As Integer
        Get
            Return YKoordinaten
        End Get
        Set(ByVal value As Integer)
            YKoordinaten = value
        End Set
    End Property
    Public Shared Maustextur() As Texture = {}
    Public Shared MeshCursor() As Objekt3D
    Shared Breite() As Integer = {}
    Shared Höhe As Integer() = {}
    Shared XHotspotBild() As Integer = {}
    Shared YHotspotBild() As Integer = {}
    Shared AnzahlderZustände() As Integer = {}
    Private Shared Frames As Integer
    Public Shared Property Frame() As Integer
        Get
            Return Frames
        End Get
        Set(ByVal value As Integer)
            Frames += 1
            If Frames >= AnzahlderZustände(Zustand) Then
                Frames = 0
            End If
        End Set
    End Property
    Public Shared Visible As Boolean = True
    'Zeichnet das Bild
    Public Shared Sub Malen()
        If ObjektMaus.Visible = True Then
            If Not My.Settings.draw3D Then
                'Wir zeichnen die Landschaft wenn sie auf der angezeigten Höhe ist
                Dim sngRotation As Double = 0
                Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
                'prüfen ob wir aus den Screenbereich laufen


                'Festlegen welchen Bereich vom Bitmap wir kopieren
                'Welcher Teil der Textur soll gemalt werden Nichts bedeutet gesamtes Bild
                With Grafikengine.recBild
                    .X = Frames * Breite(Zustand) : .Width = Breite(Zustand)
                    .Y = 0 : .Height = Höhe(Zustand)
                End With
                'Hier befindet sich das Rotationszentrum
                'Achtung Rotationszentrum ist auch Ausgangspunkt der bemalung
                With Grafikengine.ptfRotCenter
                    .X = 0
                    .Y = 0
                End With
                'Ausschnitte in den Backbuffer zeichnen
                'Wo wird das Bild gezeichnet
                Grafikengine.ptfPosition = New Drawing.Point(XKoordinate - XHotspotBild(Zustand), YKoordinate - YHotspotBild(Zustand))
                '... und wie breit ist es
                With Grafikengine.szfScale
                    .Height = Höhe(Zustand)
                    .Width = Breite(Zustand)
                End With
                'jetzt wird es in den Backbuffer gezeichnet
                Grafikengine.Sprite.Draw2D(Maustextur(Zustand), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                MalenHilfsRadius()
            Else
                'Nur kurz den Menü-Cursor malen
                Dim sngRotation As Double = 0
                Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
                With Grafikengine.recBild
                    .X = 0 : .Width = Breite(Zustände.Menü)
                    .Y = 0 : .Height = Höhe(Zustände.Menü)
                End With
                With Grafikengine.ptfRotCenter
                    .X = 0
                    .Y = 0
                End With
                Grafikengine.ptfPosition = New Drawing.Point(XKoordinate - XHotspotBild(Zustände.Menü), YKoordinate - YHotspotBild(Zustände.Menü))
                With Grafikengine.szfScale
                    .Height = Höhe(Zustände.Menü)
                    .Width = Breite(Zustände.Menü)
                End With
                Grafikengine.Sprite.Draw2D(Maustextur(Zustände.Menü), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                'Und jetzt noch den 3D Cursor!
                If Hauptmenü.SpielfeldPunkt.X >= 0 Then
                    'evtl. noch den 3D-Cursor plazieren.
                    If Not (Zustand = Zustände.Normal Or Zustand = Zustände.Menü) Or True Then
                        'Ich denke bei allen anderen können wir zeichnen, oder?
                        Grafikengine.Sprite.End()
                        Dim mat As Matrix = Matrix.Identity
                        mat.M41 = Hauptmenü.SpielfeldPunkt.X + 0.5
                        mat.M43 = -Hauptmenü.SpielfeldPunkt.Y + 0.5
                        MeshCursor(0).Malen(mat)
                        Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)
                    End If
                End If
            End If
        End If
    End Sub

    Public Sub New()
        XKoordinate = 0
        YKoordinate = 0
        CursorLaden()
    End Sub
    Public Shared Sub CursorLaden()
        If My.Settings.draw3D Then
            Array.Resize(MeshCursor, 8)
        End If
        Array.Resize(XHotspotBild, 8)
        Array.Resize(YHotspotBild, 8)
        Array.Resize(AnzahlderZustände, 8)

        For Each Maustexture In Maustextur
            Maustexture.Dispose()
        Next
        Array.Resize(Maustextur, 8)
        Array.Resize(Breite, 8)
        Array.Resize(Höhe, 8)
        If Hauptmenü.ZoomedIn Then
            uCursorladen(1, 0, 0, "Cursor", 24, 24, Zustände.Menü)
            uCursorladen(4, 17, 18, "Cursor+Spiel", 45, 50, Zustände.Normal)
            uCursorladen(4, 17, 18, "Cursor+NichtPlazierbar", 45, 50, Zustände.NichtPlazierbar)
            uCursorladen(4, 17, 18, "Cursor+Abzug", 45, 50, Zustände.Abzug)
            uCursorladen(4, 21, 22, "Cursor+Angriff", 48, 48, Zustände.Angriff)
            uCursorladen(3, 60, 60, "Cursor+SiloKlein", 120, 120, Zustände.SiloAnzeigeKlein)
            uCursorladen(3, 84, 84, "Cursor+SiloMittel", 168, 168, Zustände.SiloAnzeigeMittel)
            uCursorladen(3, 132, 132, "Cursor+SiloOmegaRakete", 264, 264, Zustände.SiloOmegaRakete)
        Else
            uCursorladen(1, 0, 0, "Cursor", 24, 24, Zustände.Menü)
            uCursorladen(4, 11, 12, "Cursor+Spiel", 30, 33, Zustände.Normal)
            uCursorladen(4, 11, 12, "Cursor+NichtPlazierbar", 30, 33, Zustände.NichtPlazierbar)
            uCursorladen(4, 11, 12, "Cursor+Abzug", 30, 33, Zustände.Abzug)
            uCursorladen(4, 14, 15, "Cursor+Angriff", 32, 32, Zustände.Angriff)
            uCursorladen(3, 40, 40, "Cursor+SiloKlein", 80, 80, Zustände.SiloAnzeigeKlein)
            uCursorladen(3, 56, 56, "Cursor+SiloMittel", 112, 123, Zustände.SiloAnzeigeMittel)
            uCursorladen(3, 88, 88, "Cursor+SiloOmegaRakete", 176, 176, Zustände.SiloOmegaRakete)
        End If
    End Sub
    Private Shared Sub uCursorladen(ByVal Frames As Integer, ByVal HotspotX As Integer, ByVal HotspotY As Integer, _
                                    ByVal Bild As String, ByVal Breite As Integer, ByVal Höhe As Integer, ByVal Index As Integer)
        AnzahlderZustände(Index) = Frames
        XHotspotBild(Index) = HotspotX
        YHotspotBild(Index) = HotspotY
        If Hauptmenü.ZoomedIn Then
            Maustextur(Index) = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Cursor\Zoomed In\" + Bild + ".png")
        Else
            Maustextur(Index) = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Cursor\Zoomed Out\" + Bild + ".png")
        End If
        If My.Settings.draw3D Then
            MeshCursor(Index) = New Objekt3D
            MeshCursor(Index).MeshBildLaden(My.Settings.Resourcenpfad + "Cursor\" + Bild + ".x")
        End If
        ObjektMaus.Breite(Index) = Breite
        ObjektMaus.Höhe(Index) = Höhe
    End Sub
    ''' <summary>
    ''' Zeichnet die Maus mit dem einem Feuerradius außen rum!
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared Sub MalenHilfsRadius()
        If My.Settings.draw3D Then Exit Sub
        If Objektverwalter.Spielfeld IsNot Nothing Then
            If Objektverwalter.Spielfeld.AktuelleEinheit IsNot Nothing Then
                Dim sngRotation As Double = 0
                Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
                Grafikengine.ptfRotCenter = New Point(Hauptmenü.Feldbreite / 2, Hauptmenü.Feldbreite / 2)
                Dim Max As Integer = Objektverwalter.Spielfeld.AktuelleEinheit.MaximaleReichweite
                Dim X As Integer = Hauptmenü.SpielfeldPunkt.X
                Dim Y As Integer = Hauptmenü.SpielfeldPunkt.Y
                With Grafikengine.szfScale
                    .Width = Hauptmenü.Feldbreite
                    .Height = Hauptmenü.Feldbreite
                End With
                If Max > 1 Then 'So eine Fernwaffe
                    Dim L As ObjektLandschaft = Wegsuchsystem.getFeldRundrum(X, Y, ObjektSpielfeld.Bodenschlacht, Max, Max, Nothing, Objektverwalter.Spielfeld)
                    Do Until L Is Nothing
                        Grafikengine.ptfPosition = New Drawing.Point(L.KooX * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, L.KooY * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY)
                        If L.KooX - X = 0 Then
                            With Grafikengine.recBild
                                .X = 0 : .Width = Hauptmenü.Feldbreite
                                .Y = 0 : .Height = Hauptmenü.Feldbreite
                            End With
                            If L.KooY > Y = 0 Then
                                sngRotation = 0
                                Grafikengine.Sprite.Draw2D(TexturenHalter.GetMausFeuerradiusTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                            Else
                                sngRotation = Math.PI
                                Grafikengine.Sprite.Draw2D(TexturenHalter.GetMausFeuerradiusTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                            End If
                        ElseIf L.KooY - Y = 0 Then
                            With Grafikengine.recBild
                                .X = 0 : .Width = Hauptmenü.Feldbreite
                                .Y = 0 : .Height = Hauptmenü.Feldbreite
                            End With

                            If L.KooX > X = 0 Then
                                sngRotation = Math.PI * 3 / 2
                                Grafikengine.Sprite.Draw2D(TexturenHalter.GetMausFeuerradiusTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                            Else
                                sngRotation = Math.PI / 2
                                Grafikengine.Sprite.Draw2D(TexturenHalter.GetMausFeuerradiusTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                            End If
                        Else
                            With Grafikengine.recBild
                                .X = Hauptmenü.Feldbreite : .Width = Hauptmenü.Feldbreite
                                .Y = 0 : .Height = Hauptmenü.Feldbreite
                            End With
                            If L.KooX > X Then
                                If L.KooY > Y Then
                                    sngRotation = Math.PI
                                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetMausFeuerradiusTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                                Else
                                    sngRotation = Math.PI / 2
                                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetMausFeuerradiusTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                                End If
                            Else
                                If L.KooY > Y Then
                                    sngRotation = Math.PI * 3 / 2
                                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetMausFeuerradiusTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                                Else
                                    sngRotation = 0
                                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetMausFeuerradiusTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                                End If
                            End If
                        End If
                        L = Wegsuchsystem.getFeldRundrum(X, Y, ObjektSpielfeld.Bodenschlacht, Max, Max, L, Objektverwalter.Spielfeld)
                    Loop
                End If
            End If
        End If
    End Sub
End Class
